package visiteurs;
import org.htmlparser.tags.Tag;

/**
 *  visiteur modifiant les liens d'une page de mani�re � concorder
 *  au syst�me de fichiers
 */
public class URLModifyingVisitor extends Visitor{

	/**
	 * constructeur
	 * @param _src url du site source
	 */
	public URLModifyingVisitor(String _src) {
		super(_src);
	}

	/**
	 * visite d'une balise afin d'isoler un lien et de le modifier
	 * @param tag balise visit�e
	 */
	public void visitTag(Tag tag){
		
		String tagName = tag.getTagName().toUpperCase();
		int codeName = getCodeName(tagName);
		String tmp;

		switch(codeName) {
			case IMG:
			case SCRIPT:	
			case FRAME:
				tmp = toRelative(tag.getAttribute("src"));
				if (tmp != null){
					if(!tmp.isEmpty())
						tag.setAttribute("SRC", tmp);
				}
				break;
			case LINK:
			case A:
				tmp = toRelative(tag.getAttribute("href"));
				
				if(tmp != null){
					if (!tmp.isEmpty()){
						
						tag.setAttribute("HREF", tmp);
					}
				}
				break;
		}
		
		switch(codeName) {
			case A:
			case FRAME:
				tmp = tag.getAttribute("HREF");
				if( tmp != null ){
					if (!tmp.isEmpty()){
						if(tmp.endsWith(".pdf") || tmp.endsWith(".png") || tmp.endsWith(".jpg")
								   || tmp.endsWith(".gif") || tmp.endsWith(".jpeg") || tmp.endsWith(".doc")
								   || tmp.endsWith(".docx") || tmp.endsWith(".xls") || tmp.endsWith(".odt")
								   || tmp.endsWith(".avi") || tmp.endsWith(".bmp") || tmp.endsWith(".rtf")
								   || tmp.endsWith(".zip") || tmp.endsWith(".rar") || tmp.endsWith(".mp3")
								   || tmp.endsWith(".mp4") || tmp.endsWith(".mpeg") || tmp.endsWith(".ods")
								   || tmp.endsWith(".pps") || tmp.endsWith(".ppt") || tmp.endsWith(".pptx")
								   || tmp.endsWith(".jpg") || tmp.endsWith(".txt") || tmp.endsWith(".wav")
								   || tmp.endsWith(".wma") || tmp.endsWith(".wmv") || tmp.endsWith(".xlsx")
								   || tmp.endsWith(".xml"))
							tag.setAttribute("HREF", tmp);
						else
							tag.setAttribute("HREF", appendDotHtml(tmp));
					}
				}
					
				break;
		}

	}

	/**
	 * passage d'une url en version relative
	 * @param _url url � transformer (si besoin)
	 * @return url relative
	 */
	private String toRelative(String _url){
		
		String changedLink;
		if(_url == null)
			return null;
		if (_url.startsWith(source))
			changedLink = (_url.length()>source.length()) ? _url.substring(source.length()) : "index.html";
		else
			changedLink = _url;
		
		
		changedLink = changedLink.replaceAll("\"|\\*|\\?|<|>|\\|", "-");
		
		return changedLink;
	}
	
	/**
	 * concat�nation de ".html" � un nom de page (si besoin)
	 * @param _url url � modifier
	 * @return url �tendue
	 */
	private String appendDotHtml(String _url){
		if (_url.startsWith("#"))
			return _url;
		
		if(_url.contains("mailto:")){
			return _url;
		}
		
		_url = _url .replaceAll(" ", "");
		_url = _url .replaceAll("\n", "");
		_url = _url .replaceAll("\t", "");
		
		if(_url != null){
			if (_url.endsWith(".html")) {
				return _url;
			}else{
				return _url+".html";
			}
		}
		return null;
	}
}
